package com.kuqi.presenters;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.util.Log;
import androidx.lifecycle.Lifecycle;
import com.google.gson.reflect.TypeToken;
import com.kuqi.common.APPCONST;
import com.kuqi.core.AppActivity;
import com.kuqi.core.SysManager;
import com.kuqi.entitiy.Book;
import com.kuqi.entitiy.Chapter;
import com.kuqi.entitiy.ReadSetting;
import com.kuqi.entitiy.ResultModel;
import com.kuqi.http.HttpHelper;
import com.kuqi.utils.JsonUtil;
import com.kuqi.utils.UrlTool;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class ReadPresenter extends BasePresenter {

    // 被代理的activity对象
    private AppActivity principal;
    //contest
    private Context context;
    // 一些命令可以提供的回调msgHandler
    private Handler callBackHandler;
    // 当前在阅读的书籍
    public Book mBook;
    // 这本书籍的章节列表
    public ArrayList<Chapter> bookChapters = new ArrayList<>(); // 正在使用的正向数据列表
    public ArrayList<Chapter> invertedOrderChapters = new ArrayList<>(); // 储存有效章节列表的反向数据
    // 一些和阅读环境相关的配置
    private ReadSetting mSetting;
    // 点击位置位于纵向的位置坐标
    public float touchPositionY;
    // 允许触发点击的范围
    public float settingOnClickValidFrom;
    public float settingOnClickValidTo;
    // 当前章节列表是 0正序  1倒序 显示的
    public int curSortflag = 0;


    // 下面是callback枚举
    public static final int FINISH_CATALOGUE = 102001;



    /**
     * 构造
     * @param context 上下文
     * @param lifecycle 管理其生命周期
     * @param callBackHandler 回调其页面功能
     * @param principal 被代理的对象
     */
    public ReadPresenter(Context context, Lifecycle lifecycle, Handler callBackHandler, AppActivity principal) {
        super(context, lifecycle);
        this.context = context;
        this.mSetting = SysManager.getSetting();
        this.principal = principal;
        this.callBackHandler = callBackHandler;
        // 初始化书籍及其关联章节的信息
        initBookAndChapterInfo(principal);
        // 允许触发点击范围（屏幕的1/4到3/4）
        settingOnClickValidFrom = principal.getCurrentActivityHeight() >> 2;
        settingOnClickValidTo = (principal.getCurrentActivityHeight() >> 2) * 3;
    }


    /**
     * 初始化书籍及其关联章节的信息
     * 这里优先从本地数据库获取
     * @param principal 代理类
     */
    private void initBookAndChapterInfo(AppActivity principal){
        // 获取传递来的书籍实体
        mBook = (Book) principal.getIntent().getSerializableExtra(APPCONST.BOOK);
        // 后台章节数据查询和矫正进程
        ChapterTask bookTask = new ChapterTask();
        bookTask.execute("0");
    }

    /**
     * 查询校验章节使用的后台进程
     */
    private class ChapterTask extends AsyncTask<String, Void, Integer> {
        // 构造函数
        ChapterTask() {}

        // 实现这个方法,让这一步功能在后台进行执行
        @Override
        protected Integer doInBackground(String... params) {

            // 调用服务器接口,获得服务器所有章节数据
            final String paramsStr = "{\"bookId\":\""+ mBook.getId() +"\"}";
            String response = HttpHelper.PostJsonString(UrlTool.URL_CHAPTER_ALL,paramsStr);
            ResultModel result = JsonUtil.getInstance().fromJson(response, ResultModel.class);
            if(result.getCode() != -1){
                String data_json = JsonUtil.getInstance().toJson(result.getData());
                List<Chapter> list_data = JsonUtil.getInstance().fromJson(
                        data_json,
                        new TypeToken<List<Chapter>>(){}.getType());
                if(list_data.size() > 0){
                     bookChapters.addAll(list_data);
                    Log.i("获取书籍章节数量",String.valueOf(list_data.size()));
                }else{
                    Log.w("获取书籍章节","数量为空!");
                }
            }else{
                Log.e("获取书籍章节异常",result.getMsg());
            }

            return null;
        }

        // 线程任务执行完成后将触发此方法,既可以用来接收参数,也可以用来直接控制UI
        @Override
        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);
            // 直接使用获取到的查询数据结果
            if(bookChapters != null && bookChapters.size() > 0){
                invertedOrderChapters.clear();
                invertedOrderChapters.addAll(bookChapters);
                Collections.reverse(invertedOrderChapters);
            }else{ // 如果显示数据为空，直接用本地章节数据列表显示
                Log.e("read-presenter", "没有查询到想要的数据");
            }

            // 时间树信息通知界面，数据的查询和刷新已经完成
            callBackHandler.sendMessage(callBackHandler.obtainMessage(FINISH_CATALOGUE));
        }
    }


    /**
     * 获取阅读的相关配置
     * @return 配置对象实体
     */
    public ReadSetting getReadConfig(){
        return mSetting;
    }

    /**
     * 获取真正的章节顺序
     * @param menuIndex 操作列表上点击的次序
     * @return 章节顺序
     */
    public int getChapterIndex(int menuIndex){
        final int position; // 章节位置
        if (curSortflag == 0) { // 如果时正序排列
            position = menuIndex;
        } else { // 如果时倒序排列
            position = bookChapters.size() - 1 - menuIndex;
        }
        return position;
    }


    /**
     * 尝试从本地缓存中获取章节正文
     * @param i 章节索引关键字
     * @return 章节实体
     */
    public Chapter getBookChapter(int i)
    {
        int position = getChapterIndex(i);
        return bookChapters.get(position);
    }


    /**
     * 解析json为章节实体
     * @param jsonStr json
     * @return 实体
     */
    public List<Chapter> parseChaptersJson(String jsonStr){
        // Log.e("解析json", jsonStr);
        ResultModel result = JsonUtil.getInstance().fromJson(jsonStr, ResultModel.class);
        String chapters = JsonUtil.getInstance().toJson(result.getData()); // 正文可能存在空格等特殊符号，不能直接toString
        List<Chapter> list_data = JsonUtil.getInstance().fromJson(
                chapters,
                new TypeToken<List<Chapter>>(){}.getType());
        return list_data;
    }

}
